#include "server/model/usermodel.hpp"
#include "db.h"
#include "public.hpp"

//可以看到参数提供的是ORM对象而不是数据库表的字段
bool UserModel::insert(User& user) {
	char sql[SQLMAXSIZE] = { 0 };
	sprintf(sql, "INSERT INTO user(name,password,state) VALUES('%s','%s','%s')",
		user.getName().c_str(), user.getPassword().c_str(), user.getState().c_str());
	MySQL mysql;
	if (mysql.connect() && mysql.update(sql)) {
		// 获取插入成功的用户数据库生成的主键id作为用户的账号
		user.setId(mysql_insert_id(mysql.getConnection()));
		return true;
	}
	return false;
}

User UserModel::query(int id) {
	char sql[SQLMAXSIZE] = { 0 };
	sprintf(sql, "SELECT * FROM user WHERE id=%d", id);
	MySQL mysql;
	User user;
	if (mysql.connect()) {
		auto* res = mysql.query(sql);	//返回指针，表示这是一种动态内存分配的操作，所以后面需要释放
		if (res) {
			auto row = mysql_fetch_row(res);
			if (row != nullptr) {
				user.setId(atoi(row[0])); // row[x]拿出来都是字符串，需要转换成int
				user.setName(row[1]);
				user.setPassword(row[2]);
				user.setState(row[3]);
			}
			mysql_free_result(res);
		}
	}
	return user;
}

bool UserModel::updateState(User& user) {
	char sql[SQLMAXSIZE] = { 0 };
	sprintf(sql, "UPDATE user SET state='%s' WHERE id=%d", user.getState().c_str(), user.getId());
	MySQL mysql;
	return mysql.connect() && mysql.update(sql);
}

bool UserModel::resetState() {
	char sql[SQLMAXSIZE] = { 0 };
	sprintf(sql, "UPDATE user SET state='offline' WHERE state='online'");
	MySQL mysql;
	return mysql.connect() && mysql.update(sql);
}
